-- 以下代码为基地大门设计

function findDevices(devices_name) 
    -- 查找设备 通常用于查找一种有多个重复的设备的时候
    -- 最后会输出所有有相同type的设备组
    -- 需要填入设备名称 类型为字符串
    local devices = {}
    for _, name in ipairs(peripheral.getNames()) do
        if peripheral.getType(name) == devices_name then
            table.insert(devices,name)
        end
    end
    return devices
end


function FindPlayer(nameList,searchRange)
    -- 寻找指定玩家 需要输入玩家列表 
    -- 当识别到有指定玩家后即返回true
    local players = coordinate.getPlayers(searchRange)
        for _, v in pairs(players) do
            for _,name in ipairs(nameList) do
                if v.name == name then
                    return true    
                end
            end
        end
    return false
end

function waitForPlayer(nameList,searchRange)
    -- 循环查找 没找到就会一直找 直到找到为止
    -- 找到后返回用户是谁
    -- 需要填入玩家列表
    while true do
        local players = coordinate.getPlayers(searchRange)
        for _, v in pairs(players) do
            for _,name in ipairs(nameList) do
                if v.name == name then
                    return v
                end
            end
        end
        os.sleep(3) -- 防止持续监测性能开销太大
    end
end

function ctrlCreate_SequencedGearshift(devices,angle)
    -- 执行操作 实现交互逻辑 目前仅限于可编程齿轮箱
    -- 需要填入设备名字和转动角度
    for _,name in ipairs(devices) do 
        peripheral.wrap(name).rotate(angle)
    end
end

players = {"MengHan23331"} -- 此处输入用户列表
searchRange = 10

while true do 
    local found = waitForPlayer(players,searchRange)

    devices = findDevices("Create_SequencedGearshift")
    ctrlCreate_SequencedGearshift(devices,180) -- 打开舱门

    os.sleep(3)

    while FindPlayer(players,searchRange) do -- 确保用户已离开指定区域
        os.sleep(3)
    end

    ctrlCreate_SequencedGearshift(devices,-180) -- 恢复原本位置

end